package com.cs.paoyer.administration.business.entity;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * DAO que me permite generar el menu
 * 
 * @author Carlos.Ruiz@consult-soft.com
 * @version 1.0
 */
 
public class MenuDAO
{
  private String strGrupoUsuario;
  private Connection conn;
  private String strPath;
  
  /**
   * 
   * @param strGrupoUsuario Codigo del grupo al que pertenece el usuario
   * actualmente logeado
   * @param conn Conexion con la base de datos
   */
  public MenuDAO(String strGrupoUsuario, Connection conn, String strPath)
  {
    this.strGrupoUsuario = strGrupoUsuario;
    this.conn=conn;
    this.strPath=strPath;
  }
  
  /**
   * 
   * @param conn Conexion con la base de datos
   */
  public void llenarTempMenu(Connection conn)
  {
    
    String strSQL="DELETE TCS_TEMP_MENU_WEB";
    try{
      Statement stm = conn.createStatement();
      int i = stm.executeUpdate(strSQL);
      strSQL="INSERT INTO TCS_TEMP_MENU_WEB "+
                  "SELECT o1.*, p.tipo_progr, g.gus_codigo, p.ubicacion, p.NOMBRE  "+
                  "FROM TCS_PROGRAMA p, TCS_OPCION o1, TCS_OPCIONES_GRUPO g "+
                  "WHERE p.codigo(+)=o1.prg_codigo "+
                  "AND g.opc_codigo = o1.codigo "+
                  "AND (fcs_val_vigencia(p.vigencia,p.desde_vigencia,p.hasta_vigencia)='S' "+
                  "AND o1.tipo_opcion = 'W')";
      i = stm.executeUpdate(strSQL);
    }catch(SQLException e)
    {
		System.err.println("/******** TDSUB - cwsub");
		e.printStackTrace();
		System.err.println("TDSUB - cwsub ********/");
    }
  }
  
  /**
   * 
   * @param strParametros Nombre de la aplicacion a la que pertenece el menu
   * @param conn Conexion con la base de datos
   * @return String con el codigo de la opcion inicial del menu
   */
  public String getOpcionInicialMenu(Connection conn)
  {
    String strSQL="SELECT CODIGO FROM TCS_OPCION "+
                  "WHERE NOMBRE  = 'PAOYER WEB' "+
                  "AND PARAMETROS =  'BENEFICIOS' ";
    try
    {
      Statement stm = conn.createStatement();
      ResultSet rs=stm.executeQuery(strSQL);
      if(rs.next())
        return rs.getString("CODIGO");
      else
        return null;
    }catch(SQLException e)
    {
		System.err.println("/******** TDSUB - cwsub");
		e.printStackTrace();
		System.err.println("TDSUB - cwsub ********/");
      return null;
    }
  }

  /**
   * 
   * @param strNivelIncio Codigo de la opcion con la que se va a iniciar un
   * nodo en el arbol del menu
   * @param conn Conexion con la base de datos
   * @return ResultSet con las opciones hijas del nodo strNivleInicio
   */
  public ResultSet getOpciones(String strNivelIncio, Connection conn)
  {
    String strSQL="SELECT UPPER(DECODE(o.tipo_opcion, 'W', UPPER(o.nombre), INITCAP(o.nombre))) "+
                          "nombre,TO_CHAR(o.codigo) codigo_hijo, DECODE(o.ubicacion,null,'#','"+strPath+"'||o.ubicacion) ubicacion "+
                  "FROM (SELECT * FROM TCS_TEMP_MENU_WEB WHERE gus_codigo = "+strGrupoUsuario+" ) o "+
                  "WHERE (o.opc_codigo=?) AND o.CAMPO_A1 IS NULL "+
                  "ORDER BY o.orden";
    try
    {
      PreparedStatement pstm = conn.prepareStatement(strSQL);
      pstm.setString(1,strNivelIncio);
      ResultSet rs=pstm.executeQuery();
      return rs;
    }catch(SQLException e)
    {
		System.err.println("/******** TDSUB - cwsub");
		e.printStackTrace();
		System.err.println("TDSUB - cwsub ********/");
      return null;
    }
  }
  
  /**
   * 
   * @param strNivel Indica el nivel del nodo, top es nivel 1, sub es nivel 2
   * sub2 es nivel 3
   * @param strNombre Nombre que se le va a dar al nodo
   * @param strUrl Url a la que apunta el nodo
   * @return String con la estructura makeMenu('nivel','nombre','url') y que 
   * es interpretada por el browser como javascript
   */
  public String getNodo(String strNivel, String strNombre, String strUrl)
  {
    String strNodo="makeMenu('"+strNivel+"','"+strNombre+"','"+strUrl+"');";
    return strNodo;
  }
  

  /**
   * 
   * @return String con el codigo javascript que me genera el menu
   */
  public String getMenu()
  {
    String strMenu="";
    try{
      llenarTempMenu(conn);
      String strNivelInicio = getOpcionInicialMenu(conn);
      ResultSet rsNivel = getOpciones(strNivelInicio,conn);
      while(rsNivel.next())
      {
        strMenu+=getNodo("top",rsNivel.getString("nombre"),rsNivel.getString("ubicacion"));
        ResultSet rsNivel2 = getOpciones(rsNivel.getString("codigo_hijo"),conn);
        while(rsNivel2.next())
        {
          strMenu+=getNodo("sub",rsNivel2.getString("nombre"),rsNivel2.getString("ubicacion")); 
          ResultSet rsNivel3 = getOpciones(rsNivel2.getString("codigo_hijo"),conn);
          while(rsNivel3.next())
          {
            strMenu+=getNodo("sub2",rsNivel3.getString("nombre"),rsNivel3.getString("ubicacion"));
          }
          rsNivel3.close();
        }
        rsNivel2.close();
      }
      rsNivel.close();
      return strMenu+"\"";
    }catch(Exception e)
    {
		System.err.println("/******** TDSUB - cwsub");
		e.printStackTrace();
		System.err.println("TDSUB - cwsub ********/");
      return null;
    }
    
  }
  
  
}